#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

// 从左到右一次遍历，只要是能匹配的一对括号，赋值1，不能匹配为0；记录连续1，以及有几个
const int M = 1e6 + 7;
struct NODE
{
	char c;
	int ID;//下标
};
bool tag[M]; // 标记哪些位置是一
string str;
stack<NODE> st;

int main()
{
	cin >> str;
	int len = str.length();
	for (int i = 0; i < len; i++)
	{
		// 如果栈不为空，且栈首元素是左括号，此时输入的是右括号就匹配并出栈
		if (!str.empty() && st.top().c == '(' && str[i] == ')')
		{
			tag[i] = tag[st.top().ID] = true;
			st.pop();
		}
		else
		{ // 否则新的元素入栈
			st.push({str[i], i});
		}
	}
	int maxlen = 0, tmp = 0, cnt = 0;
	for (int i = 0; i <= len; i++)
	{
		if (tag[i])
			tmp++; // 如果是1就累加
		else
		{
			maxlen = max(maxlen, tmp);
			tmp = 0;
		}
	}
	for (int i = 0; i <= len; i++)
	{
		if (tag[i])
			tmp++;
		else
		{
			if (tmp == maxlen)
				cnt++;
			tmp = 0;
		}
		
	}
	if (maxlen)
			cout << maxlen << " " << cnt;
		else
			cout << "0 1";
	return 0;
}
